home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Other Stuff / Other Stuff ’97 / PowerOS Development / booter / garymode.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-26  |  7.7 KB  |  172 lines  |  [TEXT/CWIE]

  1. /*
  2.     contributed by Mimir Reynisson <skelmir@qualia.com>
  3.     
  4.     virtual memory must be turned off, just as with MkLinux and BeOS
  5. */
  6.  
  7. #include "garymode.h"
  8.  
  9. static UInt16 __68ksupervisorglue[] =
  10. {
  11.     0x46FC, 0x2700,                // MOVE      #$2700,SR
  12.     0x266F, 0x0004,                // MOVEA.L   $0004(A7),A3
  13.     0x200F,                        // MOVE.L    A7,D0
  14.     0x0240, 0xFC00,                // ANDI.W    #$FC00,D0
  15.     0x2E40,                        // MOVEA.L   D0,A7
  16.     0x303C, 0x00BF,                // MOVE.W    #$00BF,D0
  17.     0x42A7,                        // CLR.L     -(A7)
  18.     0x51C8, 0xFFFC,                // DBF       D0,*-$0002     ; 00000014
  19.     0x2F6B, 0x0000, 0x00FC,        // MOVE.L    $0000(A3),$00FC(A7)    PC
  20.     0x2F6B, 0x0004, 0x0104,        // MOVE.L    $0004(A3),$0104(A7)    GPR[0]
  21.     0x200F,                        // MOVE.L     A7, D0
  22.     0x2F40, 0x010C,                // MOVE.L    D0,$010C(A7)
  23.     0x2F6B, 0x0008, 0x010C,        // MOVE.L    $0008(A3),$010C(A7)    GPR[1]
  24.     0x2F6B, 0x000C, 0x0114,        // MOVE.L    $000C(A3),$0114(A7)
  25.     0x2F6B, 0x0010, 0x011C,        // MOVE.L    $0010(A3),$011C(A7)
  26.     0x2F6B, 0x0014, 0x0124,        // MOVE.L    $0014(A3),$0124(A7)
  27.     0x2F6B, 0x0018, 0x012C,        // MOVE.L    $0018(A3),$012C(A7)
  28.     0x2F6B, 0x001C, 0x0134,        // MOVE.L    $001C(A3),$0134(A7)
  29.     0x2F6B, 0x0020, 0x013C,        // MOVE.L    $0020(A3),$013C(A7)
  30.     0x2F6B, 0x0024, 0x0144,        // MOVE.L    $0024(A3),$0144(A7)
  31.     0x2F6B, 0x0028, 0x014C,        // MOVE.L    $0028(A3),$014C(A7)
  32.     0x2F6B, 0x002C, 0x0154,        // MOVE.L    $002C(A3),$0154(A7)
  33.     0x2F6B, 0x0030, 0x015C,        // MOVE.L    $0030(A3),$015C(A7)
  34.     0x2F6B, 0x0034, 0x0164,        // MOVE.L    $0034(A3),$0164(A7)
  35.     0x2F6B, 0x0038, 0x016C,        // MOVE.L    $0038(A3),$016C(A7)
  36.     0x2F6B, 0x003C, 0x0174,        // MOVE.L    $003C(A3),$0174(A7)
  37.     0x2F6B, 0x0040, 0x017C,        // MOVE.L    $0040(A3),$017C(A7)
  38.     0x2F6B, 0x0044, 0x0184,        // MOVE.L    $0044(A3),$0184(A7)
  39.     0x2F6B, 0x0048, 0x018C,        // MOVE.L    $0048(A3),$018C(A7)
  40.     0x2F6B, 0x004C, 0x0194,        // MOVE.L    $004C(A3),$0194(A7)
  41.     0x2F6B, 0x0050, 0x019C,        // MOVE.L    $0050(A3),$019C(A7)
  42.     0x2F6B, 0x0054, 0x01A4,        // MOVE.L    $0054(A3),$01A4(A7)
  43.     0x2F6B, 0x0058, 0x01AC,        // MOVE.L    $0058(A3),$01AC(A7)
  44.     0x2F6B, 0x005C, 0x01B4,        // MOVE.L    $005C(A3),$01B4(A7)
  45.     0x2F6B, 0x0060, 0x01BC,        // MOVE.L    $0060(A3),$01BC(A7)
  46.     0x2F6B, 0x0064, 0x01C4,        // MOVE.L    $0064(A3),$01C4(A7)
  47.     0x2F6B, 0x0068, 0x01CC,        // MOVE.L    $0068(A3),$01CC(A7)
  48.     0x2F6B, 0x006C, 0x01D4,        // MOVE.L    $006C(A3),$01D4(A7)
  49.     0x2F6B, 0x0070, 0x01DC,        // MOVE.L    $0070(A3),$01DC(A7)
  50.     0x2F6B, 0x0074, 0x01E4,        // MOVE.L    $0074(A3),$01E4(A7)
  51.     0x2F6B, 0x0078, 0x01EC,        // MOVE.L    $0078(A3),$01EC(A7)
  52.     0x2F6B, 0x007C, 0x01F4,        // MOVE.L    $007C(A3),$01F4(A7)
  53.     0x2F6B, 0x0080, 0x01FC,        // MOVE.L    $0080(A3),$01FC(A7)
  54.     0x2F6B, 0x0084, 0x0200,        // MOVE.L    $0084(A3),$0200(A7)
  55.     0x2F6B, 0x0088, 0x0204,        // MOVE.L    $0088(A3),$0204(A7)
  56.     0x2F6B, 0x008C, 0x0208,        // MOVE.L    $008C(A3),$0208(A7)
  57.     0x2F6B, 0x0090, 0x020C,        // MOVE.L    $0090(A3),$020C(A7)
  58.     0x2F6B, 0x0094, 0x0210,        // MOVE.L    $0094(A3),$0210(A7)
  59.     0x2F6B, 0x0098, 0x0214,        // MOVE.L    $0098(A3),$0214(A7)
  60.     0x2F6B, 0x009C, 0x0218,        // MOVE.L    $009C(A3),$0218(A7)
  61.     0x2F6B, 0x00A0, 0x021C,        // MOVE.L    $00A0(A3),$021C(A7)
  62.     0x2F6B, 0x00A4, 0x0220,        // MOVE.L    $00A4(A3),$0220(A7)
  63.     0x2F6B, 0x00A8, 0x0224,        // MOVE.L    $00A8(A3),$0224(A7)
  64.     0x2F6B, 0x00AC, 0x0228,        // MOVE.L    $00AC(A3),$0228(A7)
  65.     0x2F6B, 0x00B0, 0x022C,        // MOVE.L    $00B0(A3),$022C(A7)
  66.     0x2F6B, 0x00B4, 0x0230,        // MOVE.L    $00B4(A3),$0230(A7)
  67.     0x2F6B, 0x00B8, 0x0234,        // MOVE.L    $00B8(A3),$0234(A7)
  68.     0x2F6B, 0x00BC, 0x0238,        // MOVE.L    $00BC(A3),$0238(A7)
  69.     0x2F6B, 0x00C0, 0x023C,        // MOVE.L    $00C0(A3),$023C(A7)
  70.     0x2F6B, 0x00C4, 0x0240,        // MOVE.L    $00C4(A3),$0240(A7)
  71.     0x2F6B, 0x00C8, 0x0244,        // MOVE.L    $00C8(A3),$0244(A7)
  72.     0x2F6B, 0x00CC, 0x0248,        // MOVE.L    $00CC(A3),$0248(A7)
  73.     0x2F6B, 0x00D0, 0x024C,        // MOVE.L    $00D0(A3),$024C(A7)
  74.     0x2F6B, 0x00D4, 0x0250,        // MOVE.L    $00D4(A3),$0250(A7)
  75.     0x2F6B, 0x00D8, 0x0254,        // MOVE.L    $00D8(A3),$0254(A7)
  76.     0x2F6B, 0x00DC, 0x0258,        // MOVE.L    $00DC(A3),$0258(A7)
  77.     0x2F6B, 0x00E0, 0x025C,        // MOVE.L    $00E0(A3),$025C(A7)
  78.     0x2F6B, 0x00E4, 0x0260,        // MOVE.L    $00E4(A3),$0260(A7)
  79.     0x2F6B, 0x00E8, 0x0264,        // MOVE.L    $00E8(A3),$0264(A7)
  80.     0x2F6B, 0x00EC, 0x0268,        // MOVE.L    $00EC(A3),$0268(A7)
  81.     0x2F6B, 0x00F0, 0x026C,        // MOVE.L    $00F0(A3),$026C(A7)
  82.     0x2F6B, 0x00F4, 0x0270,        // MOVE.L    $00F4(A3),$0270(A7)
  83.     0x2F6B, 0x00F8, 0x0274,        // MOVE.L    $00F8(A3),$0274(A7)
  84.     0x2F6B, 0x00FC, 0x0278,        // MOVE.L    $00FC(A3),$0278(A7)
  85.     0x2F6B, 0x0100, 0x027C,        // MOVE.L    $0100(A3),$027C(A7)
  86.     0x2F6B, 0x0104, 0x0280,        // MOVE.L    $0104(A3),$0280(A7)
  87.     0x2F6B, 0x0108, 0x0284,        // MOVE.L    $0108(A3),$0284(A7)
  88.     0x2F6B, 0x010C, 0x0288,        // MOVE.L    $010C(A3),$0288(A7)
  89.     0x2F6B, 0x0110, 0x028C,        // MOVE.L    $0110(A3),$028C(A7)
  90.     0x2F6B, 0x0114, 0x0290,        // MOVE.L    $0114(A3),$0290(A7)
  91.     0x2F6B, 0x0118, 0x0294,        // MOVE.L    $0118(A3),$0294(A7)
  92.     0x2F6B, 0x011C, 0x0298,        // MOVE.L    $011C(A3),$0298(A7)
  93.     0x2F6B, 0x0120, 0x029C,        // MOVE.L    $0120(A3),$029C(A7)
  94.     0x2F6B, 0x0124, 0x02A0,        // MOVE.L    $0124(A3),$02A0(A7)
  95.     0x2F6B, 0x0128, 0x02A4,        // MOVE.L    $0128(A3),$02A4(A7)
  96.     0x2F6B, 0x012C, 0x02A8,        // MOVE.L    $012C(A3),$02A8(A7)
  97.     0x2F6B, 0x0130, 0x02AC,        // MOVE.L    $0130(A3),$02AC(A7)
  98.     0x2F6B, 0x0134, 0x02B0,        // MOVE.L    $0134(A3),$02B0(A7)
  99.     0x2F6B, 0x0138, 0x02B4,        // MOVE.L    $0138(A3),$02B4(A7)
  100.     0x2F6B, 0x013C, 0x02B8,        // MOVE.L    $013C(A3),$02B8(A7)
  101.     0x2F6B, 0x0140, 0x02BC,        // MOVE.L    $0140(A3),$02BC(A7)
  102.     0x2F6B, 0x0144, 0x02C0,        // MOVE.L    $0144(A3),$02C0(A7)
  103.     0x2F6B, 0x0148, 0x02C4,        // MOVE.L    $0148(A3),$02C4(A7)
  104.     0x2F6B, 0x014C, 0x02C8,        // MOVE.L    $014C(A3),$02C8(A7)
  105.     0x2F6B, 0x0150, 0x02CC,        // MOVE.L    $0150(A3),$02CC(A7)
  106.     0x2F6B, 0x0154, 0x02D0,        // MOVE.L    $0154(A3),$02D0(A7)
  107.     0x2F6B, 0x0158, 0x02D4,        // MOVE.L    $0158(A3),$02D4(A7)
  108.     0x2F6B, 0x015C, 0x02D8,        // MOVE.L    $015C(A3),$02D8(A7)
  109.     0x2F6B, 0x0160, 0x02DC,        // MOVE.L    $0160(A3),$02DC(A7)
  110.     0x2F6B, 0x0164, 0x02E0,        // MOVE.L    $0164(A3),$02E0(A7)
  111.     0x2F6B, 0x0168, 0x02E4,        // MOVE.L    $0168(A3),$02E4(A7)
  112.     0x2F6B, 0x016C, 0x02E8,        // MOVE.L    $016C(A3),$02E8(A7)
  113.     0x2F6B, 0x0170, 0x02EC,        // MOVE.L    $0170(A3),$02EC(A7)
  114.     0x2F6B, 0x0174, 0x02F0,        // MOVE.L    $0174(A3),$02F0(A7)
  115.     0x2F6B, 0x0178, 0x02F4,        // MOVE.L    $0178(A3),$02F4(A7)
  116.     0x2F6B, 0x017C, 0x02F8,        // MOVE.L    $017C(A3),$02F8(A7)
  117.     0x2F6B, 0x0180, 0x02FC,        // MOVE.L    $0180(A3),$02FC(A7)
  118.     0x207C, 0x4761, 0x7279,        // MOVEA.L   #$47617279,A0  ; 'Gary'
  119.     0x227C, 0x0505, 0x1956,        // MOVEA.L   #$05051956,A1
  120.     0x203C, 0x0000, 0xC000,        // MOVE.L    #$0000C000,D0
  121.     0x7400,                        // MOVEQ     #$00,D2
  122.     0x4E70,
  123.     0x2F0F,                        // MOVE.L    A7,-(A7)
  124.     0xFE03,                        // DC.W      $FE03          ; ????
  125.     0x67FC,                        // BEQ.S     *-$0002        ; 00000276
  126.     0x4E75                        // RTS
  127. };
  128.  
  129. typedef struct PPCRegisterList PPCRegisterList;
  130.  
  131. typedef void (*__68KSupervisorGlueProcPtr)(PPCRegisterList* regList);
  132.  
  133. typedef UniversalProcPtr __68KSupervisorGlueUPP;
  134.  
  135. enum {
  136.     upp68KSupervisorGlueProcInfo = kCStackBased
  137.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(PPCRegisterList*)))
  138. };
  139.  
  140. #define New68KSupervisorGlueProc(userRoutine)        \
  141.         (__68KSupervisorGlueUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), upp68KSupervisorGlueProcInfo, kM68kISA)
  142.  
  143. #define Call68KSupervisorGlueProc(userRoutine, regList)        \
  144.         CallUniversalProc((UniversalProcPtr)(userRoutine), upp68KSupervisorGlueProcInfo, (regList))
  145.  
  146. static asm
  147. getCurrentSP(void)
  148. {
  149.     mr    r3, sp
  150.     blr
  151. }
  152.  
  153. void
  154. EnterPriviledgedMode(PriviledgedEntryPoint entryPoint,
  155.     void *param1, void *param2, void *param3)
  156. {
  157.     PPCRegisterList    regList;
  158.     static __68KSupervisorGlueUPP __68Kglue;
  159.  
  160.     if (__68Kglue == NULL)
  161.     {
  162.         __68Kglue = New68KSupervisorGlueProc(__68ksupervisorglue);
  163.     }
  164.     regList.PC = ((UInt32 *)entryPoint)[0];
  165.     regList.GPR[1] = getCurrentSP();
  166.     regList.GPR[2] = ((UInt32 *)entryPoint)[1];
  167.     regList.GPR[3] = (UInt32)param1;
  168.     regList.GPR[4] = (UInt32)param2;
  169.     regList.GPR[5] = (UInt32)param3;
  170.     Call68KSupervisorGlueProc(__68Kglue, ®List);
  171. }
  172.